package model.arbolBSharp.TestsArbol;

import java.util.Random;

import model.arbolBSharp.Hoja;
import model.extras.FrontCoding;
import model.registro.RegistroHoja;
import junit.framework.TestCase;

public class TestHoja extends TestCase {
	public void testInsertar() {
		Random generator = new Random();
		
		System.out.println("TEST INSERTAR");
		Hoja hoja = new Hoja();
		String[] str = new String[500];
		int aux = 0;
		float pesoGlobal = 0;
		
		System.out.println("Test de insercion y remocion por paso\n");
		for (int i = 0; i < 10; i++) {
			aux = generator.nextInt(400);
			String auxString = new String();
			auxString += aux;
			System.out.println(i+"-   "+auxString);
			str[i] = new String(auxString);
			System.out.println(i + "- Se inserta " + str[i]);
			hoja.insertar(str[i], generator.nextInt(), pesoGlobal);
			System.out.println("Registro mayor luego de insercion: " + hoja.getPalabra(hoja.getMayorRegistro()));	
			System.out.println("Registro menor luego de insercion: " + hoja.getPalabra(hoja.getMenorRegistro()));
		}
		
		imprimirHoja(hoja);
		
		for (int i = 10; i < str.length; i++) {
			System.out.println("PRUEBA INSERCION Y REMOCION:" + i+"\n");
			aux = generator.nextInt(1000);
			String auxString = new String();
			auxString += aux;
			System.out.println(i+"-   "+auxString);
			str[i] = new String(auxString);
			System.out.println(i + "- Se inserta " + str[i]);
			hoja.insertar(str[i], generator.nextInt(), pesoGlobal);
			try{
			if (generator.nextBoolean()&&generator.nextBoolean()){
				System.out.println("Remocion de reciente insercion:");
				if (hoja.buscar(auxString)){
					if (!hoja.removerRegistro(hoja.buscarRegistro(auxString))){
						System.out.println("¡No se encontro!\n");
					} else {
						System.out.println("Se removio palabra recientemente insertada: " + auxString);
						if (hoja.buscar(auxString)){
							System.out.println("¡No fue efectiva la remocion del registro!\n");
						}
					}
				}else {
					System.out.println("¡La palabra isertada recientemente no estaba!");
				}
			}
			if(generator.nextBoolean()){
				System.out.println("Remocion azarosa:");
				aux = generator.nextInt(1000);
				String auxString2 = new String(""+aux);
				if (hoja.buscar(auxString2)){
					if (!hoja.removerRegistro(hoja.buscarRegistro(auxString2))){
						System.out.println("¡No se encontro!\n" + auxString2);
					} else {
						System.out.println("Se borro el removio palabra al azar: " + auxString2);
						if (hoja.buscar(auxString2)){
							System.out.println("¡No fue efectiva la remocion del registro!\n");
						}
					}						
					System.out.println("Registro mayor: "+hoja.getPalabra(hoja.getMayorRegistro()));
					System.out.println("Registro menor: "+hoja.getPalabra(hoja.getMenorRegistro())+"\n\n");
				}else{
					System.out.println("No encontro clave azar.");
				}
				

				
				if (generator.nextBoolean()){
					System.out.println("Remocion mayor registro:");
					String auxString3 = hoja.getPalabra(hoja.getMayorRegistro());
					
					if (!hoja.removerRegistro(hoja.buscarRegistro(auxString3))){
						System.out.println("¡Problemas al borrar el mayor registro!: " + auxString3);
					}else{
						System.out.println("Se removio mayor registro: " + auxString3);
						if (hoja.buscar(auxString3)){
							System.out.println("¡No fue satisfactorio!");
						}
					}
					System.out.println("Registro mayor: "+hoja.getPalabra(hoja.getMayorRegistro()));
					System.out.println("Registro menor: "+hoja.getPalabra(hoja.getMenorRegistro())+"\n\n");
					 
				}
				if (generator.nextBoolean()){	
					System.out.println("Remocion menor registro:");
					String auxString4 = hoja.getPalabra(hoja.getMenorRegistro());
					if (!hoja.removerRegistro(hoja.buscarRegistro(auxString4))){
						System.out.println("¡Problemas al borrar el menor registro!: " + auxString4);
					}else{
						System.out.println("Se removio menor registro" + auxString4);
						if (hoja.buscar(auxString4)){
							System.out.println("¡No fue satisfactorio!");
						}
					}
					
					System.out.println("Registro mayor: "+hoja.getPalabra(hoja.getMayorRegistro()));
					System.out.println("Registro menor: "+hoja.getPalabra(hoja.getMenorRegistro())+"\n\n");
				}
				System.out.println("Registro mayor: "+hoja.getPalabra(hoja.getMayorRegistro()));
				System.out.println("Registro menor: "+hoja.getPalabra(hoja.getMenorRegistro()));
				System.out.println("\n\n");
			}
			} catch (Exception e){
				e.printStackTrace();
			}
		}
		/*
		for (int i = 0; i < str.length; i++) {
			aux = generator.nextInt(100);
			String auxString = new String();
			auxString += aux;
			System.out.println(i+"-   "+auxString);
			str[i] = new String(auxString);
		}

		for (int i = 0; i < str.length; i++) {
			System.out.println(i + "- Se inserta " + str[i]);
			hoja.insertar(str[i], generator.nextInt(), pesoGlobal);
		}*/
		
		imprimirHoja(hoja);
		System.out.println("Remocion azarosa de 20 registros:");
		for (int i = 0; i < 20; i++) {
			aux = generator.nextInt(400);
			String auxString = new String();
			auxString += aux;
			System.out.println(i+"-   "+auxString);
			try {
				hoja.removerRegistro(hoja.buscarRegistro(auxString));
			} catch (Exception e) {
				System.out.println("No se encontró "+ auxString);
			}
		}
		
		imprimirHoja(hoja);

		// System.out.println("el tama�io de la lista fue
		// "+hoja.getListaRegistroTermino().size());
	}

	public void estFrontCoding() {

		System.out.println();
		System.out.println();
		System.out.println();
		System.out.println("TEST DE FRONT CODING");

		String[] str = new String[34];
		str[0] = "casa";
		str[1] = "cosa";
		str[2] = "casi";
		str[3] = "adolfo";
		str[4] = "casamiento";
		str[5] = "caso";
		str[6] = "cataratas";
		str[7] = "catarro";
		str[8] = "carreta";
		str[9] = "campo";
		str[10] = "cagada";
		str[11] = "comida";
		str[12] = "comilon";
		str[13] = "comitea";
		str[14] = "mariano";
		str[15] = "mario";
		str[16] = "marianela";
		str[17] = "mama";
		str[18] = "maria";
		str[19] = "comida";
		str[20] = "algo";
		str[21] = "alguien";
		str[22] = "alguno";
		str[23] = "aveces";
		str[24] = "lucia";
		str[25] = "lucila";
		str[26] = "luchar";
		str[27] = "luces";
		str[28] = "lumina";
		str[29] = "luminoso";
		str[30] = "lucas";
		str[31] = "cataratas";
		str[32] = "casino";
		str[33] = "cazador";
		int viejos = 0;

		RegistroHoja reg = new RegistroHoja();

		String palabra1 = str[0];
		String palabra2;
		reg.setCantCaractNuevos(palabra1.length());
		reg.setCantCaractRepetidos(viejos);
		reg.setTerm(palabra1);
		reg.setOffset(0);
		reg.setPesoGlobal(0);

		Hoja hoja = new Hoja();
		hoja.getListaRegistroHoja().add(reg);

		for (int i = 0; i < str.length - 1; i++) {
			palabra2 = str[i + 1];
			insertarDesordenado(hoja, palabra1, palabra2);
			palabra1 = palabra2;
		}

		imprimirHoja(hoja);

	}

	public void estRemover() {

		System.out.println();
		System.out.println();
		System.out.println("TEST REMOVER");

		Hoja hoja = new Hoja();
		hoja.insertar("caca", 0, 0);
		hoja.insertar("cacao", 1, 0);
		hoja.insertar("cacaroto", 2, 0);
		hoja.insertar("capas", 3, 0);
		hoja.insertar("cama", 4, 0);
		hoja.insertar("categoria", 5, 0);
		hoja.insertar("camion", 6, 0);
		hoja.insertar("casino", 7, 0);
		hoja.insertar("casa", 8, 0);
		hoja.insertar("callar", 9, 0);
		hoja.insertar("cazador", 10, 0);
		hoja.insertar("capricho", 11, 0);
		hoja.insertar("casamiento", 12, 0);
		hoja.insertar("casador", 13, 0);
		hoja.insertar("carro", 14, 0);
		hoja.insertar("caroso", 15, 0);
		hoja.insertar("canelon", 16, 0);
		hoja.insertar("casquete", 17, 0);
		hoja.insertar("castillo", 18, 0);

		imprimirHoja(hoja);

		System.out.println();
		System.out.println();
		System.out.println("removemos algunas palabras");
		RegistroHoja reg = new RegistroHoja();

		reg = hoja.buscarRegistro("camion");
		if (reg != null) {
			hoja.removerRegistro(reg);
			System.out.println("Borro camion");
		} else
			System.out.println("No se pudo borrar camion");

		reg = hoja.buscarRegistro("casa");
		if (reg != null) {
			hoja.removerRegistro(reg);
			System.out.println("Borro casa");
		} else
			System.out.println("No se pudo borrar casa");

		reg = hoja.buscarRegistro("carro");
		if (reg != null) {
			hoja.removerRegistro(reg);
			System.out.println("Borro carro");
		} else
			System.out.println("No se pudo borrar carro");

		reg = hoja.buscarRegistro("casamiento");
		if (reg != null) {
			hoja.removerRegistro(reg);
			System.out.println("Borro casamiento");
		} else
			System.out.println("No se pudo borrar casamiento");

		reg = hoja.buscarRegistro("camion");
		if (reg != null)
			hoja.removerRegistro(reg);
		else
			System.out.println("No se pudo borrar camion (otra vez)");

		imprimirHoja(hoja);
	}

	private static void insertarDesordenado(Hoja hoja, String palabra1,
			String palabra2) {
		FrontCoding fg = new FrontCoding();
		fg.compacto(palabra1, palabra2);
		RegistroHoja reg2 = new RegistroHoja();

		reg2.setCantCaractNuevos(fg.getNuevos());
		reg2.setCantCaractRepetidos(fg.getAnteriores());
		reg2.setTerm(fg.getTermino());
		reg2.setOffset(0);
		reg2.setPesoGlobal(0);
		hoja.getListaRegistroHoja().add(reg2);
	}

	private static void imprimirHoja(Hoja leerHoja) {
		System.out.println("Tipo de nodo: hoja");
		System.out
				.println("Numero de nodo: " + leerHoja.getPosicionEnArchivo());
		System.out.println("Nivel: 0");
		System.out.println("Cantidad de registros: "
				+ leerHoja.cantidadRegistros());

		if (leerHoja.getPunteroASiguiente() == null) {
			System.out.println("Siguiente hoja: ninguna");
		} else {
			System.out.println("Siguiente hoja: "
					+ leerHoja.getPunteroASiguiente());
		}
		System.out.println("Listado de terminos:");
		for (RegistroHoja registro : leerHoja.getListaRegistroHoja())
			System.out.print("(Termino: " + registro.getTermino()
					+ " \t\t Expandido:" + leerHoja.getPalabra(registro)
					+ "\t, Offset: " + registro.getOffset() + "\t, pesoGlobal:"
					+ registro.getPesoGlobal() + ") \n");
	}
}
